<?php
class System_Plugin_Action_CreateObject extends System_Plugin_Action_Default {

	/**
	 * eindeutige Identifikation der Aktion, wird in der Datenbank als hid abgespeichert
	 * @var string $_hid
	 */
	protected $_hid = 'CreateObject';

	/**
	 * Aufgrund dieser Methodenname, wird nach Methoden zur Verarbeitungszeit, zur
	 * Verarbeitungsmenge und Verarbeitungsendresultat gesucht
	 * @var string $_executionMethods
	 */
	protected $_executionMethods = array('Action', 'Resources');

	/**
	 * Konstruktor der Klasse System_Plugin_Action_CollectResource
	 * @param none
	 * @return none;
	 */
	public function __construct() {

		// Aktionsdaten vorbereiten
		$this->_prepareActionData();
	}

	/**
	 * Initiale Methode, wenn die Action der Queue hinzugefuegt wird
	 * @param int $parentObjectId Id des Objektes, zu dem das Objekt hinzugefuegt werden soll
	 *	z.B. Bauplatz, Inventar, ...
	 * @return object Instanz auf die Klasse System_Plugin_Action_CreateObject
	 */
	public function onInit($parentObjectId) {

		if(empty($parentObjectId)) {
			throw new Exception('beim Initialisieren der Action CreateObject muss eine Eltern Id angegeben werden', 0);
			return false;
		}

		// Event setzen
		$this->_setEventCode(System_Plugin_Action_Default::EVENT_ON_INIT);

		// fuer die Produktion benoetigte Resourcen werden meist direkt abgezogen, deswegen
		// durchlaufe alle Resourcen mit Value-Wert und ziehe ihn ab
		$mStorage	= new Application_Model_StorageResources();
		$dStorage	= $mStorage->findall(array('storage_resources.resources_id IN (?)' => array_keys($this->_actionData->use->resources)));

		foreach($dStorage as $dStorageResource) {
			$actionResource = $this->_actionData->use->resources[$dStorageResource->resource->id];
			if($actionResource->value !== null) {

				// ueberpruefe zuerst ob genuegend Resourcen vorhanden sind
				if($dStorageResource->resource->curValue <= $actionResource->value) {
					throw new Exception('Objekt konnte nicht angelegt werden. Es sind nicht genuegend Resourcen vorhanden', 0);
					return false;

				}
			}
		}

		// wenn ich bis hierher gekommen bin, sind genuegend Resourcen vorhanden
		foreach($dStorage as $dStorageResource) {
			$actionResource = $this->_actionData->use->resources[$dStorageResource->resource->id];
			if($actionResource->value !== null) {
				$dStorageResource->resource->curValue -= $actionResource->value;
				$mStorage->save($dStorageResource);
			}
		}

		// Eltern Objekt erstellen
		$dParentGameObject = new Application_Model_Schema_Object();
		$dParentGameObject->setId($parentObjectId);

		// Neues Objekt bei den Benutzerobjekten erzeugen; hierfuer wird aus der Tabelle
		// action_produce_objects das Zielobjekt ausgelesen -> sollte nur eins sein!
		foreach($this->_actionData->produce->objects as $actionObject) {
			$dObject = new Application_Model_Schema_Object();
			$dObject->setId($actionObject->id);

			$dGameObject = new Application_Model_Schema_GameObject();
			$dGameObject
				->setObject($dObject)
				->setParent($dParentGameObject);
			$this->setObjectData($dGameObject);
		}

		// bisher abgelaufene Zeit auf 0 setzen
		if($this->_actionData->executionTime !== null) {
			$this->setElapsedTime(0);
		}

		return $this;
	}

	/**
	 * Diese Methode wird aufgerufen wenn die Methode als abgeschlossen gekennzeichnet wird.
	 * Bei dieser Aktion wird eine zufaellige Menge der gesuchten Resource dem Lager hinzugefuegt
	 * @param none
	 * @return object Instanz auf die Klasse System_Plugin_Action_CollectResource
	 */
	public function onComplete() {
		parent::onComplete();

		// erstelltes Objekt auf enabled setzen
		$mGameObject = new Application_Model_GameObjects();

		foreach($this->_objectData as $dGameObject) {
			$dGameObject->setEnabled(true);
			$mGameObject->save($dGameObject);
		}
	}
}
?>